package com.lizhi.service;

import com.lizhi.entity.LocalTask;
import com.lizhi.enums.SubTaskState;

import java.util.List;

public interface TaskService {
    /**
     * 发布一个任务类型为taskType的任务
     *
     * @param taskType     任务类型
     * @param businessKeys 业务主键集合
     * @return
     */
    boolean publishTask(String taskType, List<String> businessKeys);

    /**
     * 得到指定主任务的指定子任务的状态
     *
     * @param taskId       主任务id
     * @param subTaskIndex 子任务索引
     * @return
     */
    SubTaskState getSubTaskState(Integer taskId, Integer subTaskIndex);

    /**
     * 得到指定主任务的详细信息
     *
     * @param taskId 任务id
     * @return
     */
    LocalTask getTaskById(Integer taskId);

    /**
     * 完成主任务的子任务
     *
     * @param taskId       主任务id
     * @param subTaskIndex 子任务索引
     * @param errorMessage 失败原因 为null就是成功
     */
    boolean completeSubTask(Integer taskId, Integer subTaskIndex, String errorMessage);

    /**
     * 完成子任务，自动完成当前正在执行的任务
     * 根据nextSubTaskIndex
     *
     * @param taskId       主任务id
     * @param errorMessage 失败原因 为null就是成功
     */
    boolean completeSubTask(Integer taskId, String errorMessage);

    /**
     * 开启主任务的指定子任务，乐观锁开启，保证只有一个线程能开启此子任务
     *
     * @param taskId       主任务id
     * @param subTaskIndex 子任务索引
     * @return
     */
    boolean startSubTask(Integer taskId, Integer subTaskIndex);

    /**
     * 开启主任务的下一个子任务
     * 根据nextSubTaskIndex
     *
     * @param taskId
     * @return
     */
    boolean startSubTask(Integer taskId);

    /**
     * 下发任务
     * 有分片参数
     *
     * @param shardSize
     * @param shardIndex
     * @param limit
     * @return
     */
    List<LocalTask> dispatchTasks(String taskType, Integer shardSize, Integer shardIndex, Integer limit);

    /**
     * 下发指定类型任务的
     *
     * @param taskType
     * @param limit
     * @return
     */
    List<LocalTask> dispatchTasks(String taskType, Integer limit);
}
